home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 54813 / 54813.xpi / chrome / content / add2cal.js next >
Text File  |  2009-12-21  |  33KB  |  391 lines

  1. HTML = "http://www.w3.org/1999/xhtml"
  2.  
  3. var add2cal_location_listener =
  4. {
  5.     QueryInterface: function (aIID)
  6.     {
  7.         if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
  8.             aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
  9.             aIID.equals(Components.interfaces.nsISupports))
  10.         {
  11.             return this
  12.         }
  13.         throw Components.results.NS_NOINTERFACE
  14.     },
  15.     
  16.     onLocationChange: function (aProgress, aRequest, aURI)
  17.     {
  18.         add2cal.handle_new_url(aProgress.DOMWindow)
  19.     },
  20.     
  21.     onStateChange: function (a, b, c, d) {},
  22.     onProgressChange: function (a, b, c, d, e, f) {},
  23.     onStatusChange: function (a, b, c, d) {},
  24.     onSecurityChange: function (a, b, c) {}
  25. };
  26.  
  27.  
  28. var add2cal = 
  29. {
  30.     cache: {},
  31.     
  32.     hidden_alert_by_tab: {},
  33.     
  34.     showing: false,
  35.     
  36.     domain: 'add2cal.blackdrumm.com',
  37.     
  38.     init: function ()
  39.     {
  40.         add2cal.log_action({
  41.             action: 'extension-load'
  42.         })
  43.         
  44.         gBrowser.addProgressListener(
  45.             add2cal_location_listener,
  46.             Components.interfaces.nsIWebProgress.NOTIFY_LOCATION
  47.         )
  48.         
  49.         add2cal.popup = document.getElementById('add2cal-popup')
  50.         add2cal.alert = document.getElementById('add2cal-alert')
  51.         add2cal.button = document.getElementById('add2cal-button')
  52.         
  53.         document.getElementById('add2cal-close-popup').addEventListener('click', function ()
  54.         {
  55.             add2cal.close_alert(true)
  56.             add2cal.log_action({
  57.                 action: 'alert-hide',
  58.                 source: 'alert-button',
  59.                 url: content.location.href
  60.             })
  61.         }, false)
  62.         
  63.         add2cal.button.addEventListener('click', function ()
  64.         {
  65.             if (add2cal.showing)
  66.             {
  67.                 add2cal.close_alert(true)
  68.             }
  69.             
  70.             var sel = content.window.getSelection()
  71.             
  72.             if (sel.toString())
  73.             {
  74.                 add2cal.load_bookmarklet()
  75.                 
  76.                 add2cal.log_action({
  77.                     action: 'bookmarklet-load',
  78.                     source: 'toolbar-button',
  79.                     url: content.location.href,
  80.                     selection: sel.toString()
  81.                 })
  82.             }
  83.             else
  84.             {
  85.                 add2cal.load_bookmarklet()
  86.                 
  87.                 add2cal.log_action({
  88.                     action: 'bookmarklet-load',
  89.                     source: 'toolbar-button',
  90.                     url: content.location.href
  91.                 })
  92.             }
  93.         }, false)
  94.     },
  95.     
  96.     uninit: function ()
  97.     {
  98.         gBrowser.removeProgressListener(add2cal_location_listener);
  99.     },
  100.     
  101.     close_alert: function (keep_active)
  102.     {
  103.         if (!keep_active)
  104.         {
  105.             add2cal.button.setAttribute('image', 'chrome://add2cal/skin/icon.png')
  106.         }
  107.         
  108.         if (!add2cal.showing)
  109.         {
  110.             return
  111.         }
  112.         
  113.         add2cal.popup.hidePopup()
  114.         
  115.         if (keep_active)
  116.         {
  117.             if (typeof add2cal.hidden_alert_by_tab[content.location.href] == 'undefined')
  118.             {
  119.                 add2cal.hidden_alert_by_tab[content.location.href] = true
  120.                 content.addEventListener('unload', (function(url)
  121.                 {
  122.                     return function ()
  123.                     {
  124.                         delete add2cal.hidden_alert_by_tab[url]
  125.                     }
  126.                 })(content.location.href), false)
  127.             }
  128.         }
  129.         
  130.         add2cal.showing = false
  131.     },
  132.     
  133.     show_alert: function (from_button_click, is_quiet)
  134.     {
  135.         add2cal.button.setAttribute('image', 'chrome://add2cal/skin/icon_active.png')
  136.         
  137.         if ((
  138.             add2cal.hidden_alert_by_tab[content.location.href] || is_quiet) && !from_button_click)
  139.         {
  140.             return
  141.         }
  142.         
  143.         add2cal.log_action({
  144.             action: 'alert-show',
  145.             url: content.location.href
  146.         })
  147.         
  148.         add2cal.popup.openPopup(add2cal.button, "after_end", 20, 0, false, false)
  149.         add2cal.showing = true
  150.         
  151.         setTimeout(function ()
  152.         {
  153.             add2cal.close_alert(true)
  154.         }, 5000)
  155.     },
  156.     
  157.     handle_new_url: function (win, from_button_click)
  158.     {
  159.         add2cal.close_alert()
  160.         
  161.         var cached = add2cal.cache[win.location.href]
  162.         
  163.         if (typeof cached != "undefined")
  164.         {
  165.             if (cached == null)
  166.             {
  167.                 if (from_button_click)
  168.                 {
  169.                     add2cal.load_bookmarklet()
  170.                     add2cal.log_action({
  171.                         action: 'bookmarklet-load',
  172.                         source: 'toolbar-button',
  173.                         url: content.location.href
  174.                     })
  175.                 }
  176.                 return
  177.             }
  178.             
  179.             add2cal.handle_hit(cached[0], cached[1], win, from_button_click)
  180.             return
  181.         }
  182.         
  183.         var scraper = null
  184.         
  185.         for (n in scrapers)
  186.         {
  187.             var s = scrapers[n]
  188.             
  189.             if (win.location.href.match(s))
  190.             {
  191.                 scraper = n
  192.                 break
  193.             }
  194.         }
  195.         
  196.         if (scraper)
  197.         {
  198.             add2cal.cache[win.location.href] = [null, true]
  199.             add2cal.handle_hit(null, true, win, from_button_click, quiet_scrapers.indexOf(scraper) != -1)
  200.             return
  201.         }
  202.         
  203.         var parts
  204.         
  205.         try
  206.         {
  207.             parts = win.location.host.split('.')
  208.         }
  209.         catch (e)
  210.         {
  211.             if (from_button_click)
  212.             {
  213.                 add2cal.load_bookmarklet()
  214.                 add2cal.log_action({
  215.                     action: 'bookmarklet-load',
  216.                     source: 'toolbar-button',
  217.                     url: content.location.href
  218.                 })
  219.             }
  220.             return
  221.         }
  222.         
  223.         if (parts.length == 2)
  224.         {
  225.             parts.unshift('www')
  226.         }
  227.         
  228.         var domain = parts.join('.')
  229.         
  230.         if (-1 < domains.indexOf(domain))
  231.         {
  232.             var req = new XMLHttpRequest()
  233.             req.open('GET', add2cal.get_base_url()+'/entities_by_url?url='+encodeURIComponent(win.location.href), true)
  234.             req.onreadystatechange = function (e)
  235.             {
  236.                 if (req.readyState == 4)
  237.                 {
  238.                     var result = JSON.parse(req.responseText)
  239.                     
  240.                     if (result.events || result.venues)
  241.                     {
  242.                         add2cal.cache[win.location.href] = [result, false]
  243.                         add2cal.handle_hit(result, false, win, from_button_click)
  244.                     }
  245.                     else
  246.                     {
  247.                         add2cal.cache[win.location.href] = null
  248.                         if (from_button_click)
  249.                         {
  250.                             add2cal.load_bookmarklet()
  251.                         }
  252.                     }
  253.                 }
  254.             }
  255.             req.send(null)
  256.         }
  257.         else
  258.         {
  259.             add2cal.cache[win.location.href] = null
  260.             
  261.             if (from_button_click)
  262.             {
  263.                 add2cal.load_bookmarklet()
  264.             }
  265.         }
  266.     },
  267.     
  268.     handle_hit: function (entities, scraper, win, from_button_click, is_quiet)
  269.     {
  270.         if (win.content.document.getElementById('add2cal'))
  271.         {
  272.             return
  273.         }
  274.         
  275.         if (add2cal.alert.hasChildNodes())
  276.         {
  277.             while (add2cal.alert.childNodes.length > 0)
  278.             {
  279.                 add2cal.alert.removeChild(add2cal.alert.firstChild)
  280.             }
  281.         }
  282.         
  283.         var info = ''
  284.         
  285.         if (scraper || entities && entities.events)
  286.         {
  287.             info = 'We found upcoming events on this page.'
  288.         }
  289.         else if (entities && entities.venues)
  290.         {
  291.             info = 'Creating an event for this venue?'
  292.         }
  293.         else
  294.         {
  295.             return
  296.         }
  297.         
  298.         add2cal.alert.appendChild(document.createTextNode(info+' '))
  299.         add2cal.alert.appendChild(document.createElementNS(HTML, 'br'))
  300.         
  301.         var link = document.createElementNS(HTML, 'a')
  302.         link.setAttribute('href', '#')
  303.         link.appendChild(document.createTextNode('add.2.cal ┬╗'))
  304.         add2cal.alert.appendChild(link)
  305.         
  306.         add2cal.alert.style.display = 'block'
  307.         
  308.         link.addEventListener('click', function ()
  309.         {
  310.             add2cal.close_alert(true)
  311.             add2cal.load_bookmarklet()
  312.             
  313.             add2cal.log_action({
  314.                 action: 'bookmarklet-load',
  315.                 source: 'alert',
  316.                 url: content.location.href
  317.             })
  318.         }, false)
  319.         
  320.         add2cal.show_alert(from_button_click, is_quiet)
  321.     },
  322.     
  323.     load_bookmarklet: function ()
  324.     {
  325.         var doc = content.document
  326.         var head = doc.getElementsByTagName('head')[0]
  327.         var script = doc.createElement('script')
  328.         script.type = 'text/javascript'
  329.         script.src = add2cal.get_base_url()+'/bookmarklet/load?t='+(new Date().getTime())
  330.         head.appendChild(script)
  331.     },
  332.     
  333.     get_base_url: function ()
  334.     {
  335.         if (content.location.href.indexOf('https') == 0)
  336.         {
  337.             return 'https://'+add2cal.domain
  338.         }
  339.         else
  340.         {
  341.             return 'http://'+add2cal.domain
  342.         }
  343.     },
  344.     
  345.     log_action: function (details)
  346.     {
  347.         details['area'] = 'firefox-addon'
  348.         
  349.         var pairs = []
  350.         
  351.         for (n in details)
  352.         {
  353.             var encoded_n = encodeURIComponent(n)
  354.             
  355.             if (details[n].constructor == Array)
  356.             {
  357.                 details[n].forEach(function (v)
  358.                 {
  359.                     pairs.push(encoded_n+'='+encodeURIComponent(v))
  360.                 })
  361.             }
  362.             else
  363.             {
  364.                 pairs.push(encoded_n+'='+encodeURIComponent(details[n]))
  365.             }
  366.         }
  367.         
  368.         var data = pairs.join('&')
  369.         
  370.         var req = new XMLHttpRequest()
  371.         req.open('POST', add2cal.get_base_url()+'/actions/log', true)
  372.         req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
  373.         req.setRequestHeader('Content-Length', data.length)
  374.         req.send(data)
  375.     }
  376. }
  377.  
  378. window.addEventListener("load", function() { add2cal.init() }, false);
  379. window.addEventListener("unload", function() { add2cal.uninit() }, false);
  380.  
  381.  
  382. var scrapers = {
  383.     facebook: /(facebook\.com\/event\.php[^#]+$)|(facebook\.com(.+)#\/event\.php)/,
  384.     evite: /evite\.com\/pages\/invite\/viewInvite\.jsp/,
  385.     yelp: /yelp\.com\/biz\//
  386. }
  387.  
  388. var quiet_scrapers = ['yelp']
  389.  
  390. var domains = ['scratch.dev.lan','www.chapeausf.com','www.cafebastillesf.com','www.topofthemark.com','www.fishermanswharf.hyatt.com','www.firesidecamera.com','firenzebynight.ypguides.net','www.sanfranciscomerchants.com','www.glaskat.com','www.mezzaninesf.com','www.calacademy.org','www.larkspurhotelunionsquare.com','www.penapachamama.com','www.matrixfillmore.com','www.sfplayhouse.org','www.mandarinoriental.com','www.biasrestaurantandwinebar.com','www.cartoonart.org','www.eossf.com','www.stanfordparkhotel.com','www.chouchousf.com','www.litquake.org','tzsf-tickets.zinzanni.org','www.pasharestaurant.com','www.studioforurbanprojects.org','www.kuletos.com','www.postrio.com','www.waxmuseum.com','www.angelisland.org','portal.sfusd.edu','www.themarsh.org','www.cruisinthecastro.com','www.ftloose.org','www.straitsrestaurants.com','www.labohemerestaurant.com','www.trattoriacontadina.com','www.jazzatpearls.com','www.eastsidewestsf.com','www.townhallsf.com','www.stmarks-sf.org','www.suminthecastro.com','www.tndc.org','www.figaroristorante.com','www.pantareirestaurant.com','www.LarkCreekSteak.com','www.LaCiccia.com','www.a16sf.com','www.gammasf.com','www.ghirardellisq.com','www.sherithisrael.org','www.workspacelimited.org','www.mochicasf.com','www.viognierrestaurant.com','www.exoticeroticball.com','www.thecaprice.com','www.neimanmarcus.com','www.californiapioneers.org','www.bloomingdales.com','www.sfvampiretour.com','www.gcjm.com','www.sfheritage.org','www.architecturesf.com','www.almasrisfca.com','www.trapezerestaurant.com','www.asianart.org','museum.stanford.edu','www.sfballet.org','www.jacksonfillmoresf.com','www.sfmart.com','www.ristorantemataro.com','www.lezinc.com','www.sfcm.edu','www.sfcb.org','www.letrianongallery.com','www.hydestreetbistrosf.com','www.thebuenavista.com','www.blowfishsushi.com','www.ci.sf.ca.us','www.castrostreetfair.org','www.sfartscommission.org','www.henryshunanrestaurant.com','www.aftermodern.com','www.frescasf.com','www.sens-sf.com','www.marinemammalcenter.org','www.ahl-missionbay.com','www.rhodyco.com','www.fandorinrestaurant.com','www.delanceystreetfoundation.org','www.acmechophouse.com','www.sfbc.org','www.guaymasrestaurant.com','www.yanksing.com','www.sfcityguides.org','www.astariasm.com','www.bushi-tei.com','www.therichmondsf.com','www.redvicmoviehouse.com','www.mccormickandschmicks.com','www.bayarea-events.com','www.boxcartheatre.org','www.elraigon.com','www.sflatinofilmfestival.com','www.johnnyfoleys.com','www.boccecafe.com','www.bhnc.org','www.thejugshop.com','www.townsc.com','www.epiphanydance.org','www.croatianamericanweb.org','www.ticketmaster.com','www.sfarmory.com','www.broadwaystudios.com','www.chouquets.com','www.shoppingthemusical.com','www.randallmuseum.org','www.horizonssausalito.com','www.doloresparkcafe.org','www.annabellassanfrancisco.com','www.cityclubsf.com','www.buffaloexchange.com','www.wattis.org','www.taocafe.com','www.pompeisgrottosf.com','www.suppenkuche.com','www.paragonrestaurant.com','www.therootsrestaurant.com','www.sanfranciscovisitor.com','www.sf-local.com','www.sfwmpac.org','www.streetcar.org','www.shanghai1930.com','www.tresagaves.com','www.actorstheatresf.org','www.vesuvio.com','www.terzosf.com','www.carnelianroom.com','www.chezpapasf.com','www.harlotsf.com','www.brava.org','www.ritzcarltondiningroom.com','www.villaromanasf.com','www.sfmoma.org','www.namubar.com','www.cantucciosf.com','www.martinlawrence.com','www.ashoka-sf.com','www.japantownparking.com','www.stompede.com','www.livesushibar.com','www.huntingtonhotel.com','www.moadsf.org','www.chaamthaisf.com','www.yourmusegallery.com','stepout.diabetes.org','www.deep-sf.com','www.hanazenrestaurant.com','www.defyinginequality.com','www.mocfa.org','www.sfmusic.org','www.ginakhan.com','www.rubyskye.com','www.americancyclery.com','www.fairmont.com','www.sfvenues.com','www.ristorantespasso.com','www.maharanirestaurant.com','www.conduitrestaurant.com','www.verdiclub.net','www.westin.com','www.butterflysf.com','www.sresproductions.com','www.mex-df.com','www.creativityexplored.org','www.milanosf.com','www.sffilmcentre.com','www.medjoolsf.com','www.modernthaisf.com','www.rotibistro.com','www.cafetiramisu.com','www.celebrateclitoris.com','www.pinktriangleproject.com','www.lecharm.com','www.sfnpc.org','www.goldengateparkgolf.com','www.bocasf.com','www.restaurantmarche.com','www.uusf.org','www.FishermensGrotto.com','www.bayanihancc.org','www.sfiac.org','www.masonicauditorium.com','www.beachblanketbabylon.com','www.stfyc.com','www.barracudasushi.com','www.lime-sf.com','www.doe-sf.com','www.buckeyeroadhouse.com','www.cherylburkedance.com','www.slanteddoor.com','www.thirstybear.com','www.sfpalm.org','www.kuletostrattoria.com','www.Izzyssteaksandchops.com','www.grandcafe-sf.com','www.roycegallery.com','www.roxie.com','www.emanuelsf.org','www.a3atmosphere.com','www.tannourinecuisine.com','www.thetipsypigsf.com','www.lamarsf.com','www.himmelbergergallery.com','www.sfjazz.org','www.savannajazz.com','www.ramprestaurant.com','www.solsticelounge.com','www.meridiangallery.org','www.ritzcarlton.com','www.tara-restaurant.com','www.kincaids.com','www.sushiran.com','www.kingchacha.com','www.frantoio.com','www.custommade.org','www.azuresancarlos.com','www.btwcsc.org','www.amnesiathebar.com','www.wexlerssf.com','www.fillmorejazzfestival.com','www.townsendrb.com','www.waterbarsf.com','www.ripleysf.com','www.oldfirstconcerts.org','lodi.winecountry.com','www.epicroasthousesf.com','www.jardiniere.com','www.posterfair.com','www.leftatalb.com','www.laiola.com','www.thoreau.org','www.capurros.com','www.greatbuildings.com','www.piacererestaurant.com','www.ghirardelli.com','www.threeseasonsrestaurant.com','www.ristoranterocca.com','www.piazzamarket.com','www.mtbs.com','WWW.RESTAURANTCASSIS.COM','www.cantinasf.com','www.sfzoo.org','www.arionpress.com','www.dancealongnutcracker.org','www.swedishamericanhall.com','www.restaurantanzu.com','www.gamh.com','www.cliffhouse.com','www.dnalounge.com','www.flaxart.com','www.sfhistory.org','www.sffas.org','web.mac.com','www.angelinorestaurant.com','www.ninthstreet.org','www.kaygetsu.com','www.skatebowl.com','www.sfmomos.com','www.anniessocialclub.com','www.outthedoors.com','www.ubayp.com','www.fourseasons.com','www.searsfinefood.com','www.andrewshotel.com','www.festoonsalon.com','www.tajhotels.com','www.blueplatesf.com','www.offmarkettheater.com','www.cavallopoint.com','www.dosasf.com','www.fleetweek.us','www.coyoteptmuseum.org','www.lexingtonclub.com','www.americandreams.com','www.bottomofthehill.com','www.templesf.com','www.perbaccosf.com','www.unicorndining.com','www.globerestaurant.com','www.cobbscomedy.com','www.shrinesf.org','www.sfjazzhotplate.org','www.paliodasti.com','www.circasf.com','www.slowclub.com','www.fogcitydiner.com','www.delessiomarket.com','www.sfautoshow.com','www.charangasf.com','www.thefishmarket.com','www.fmlp.org','www.sahasf.com','www.laprovencesf.com','www.sffs.org','www.eurekatheatre.org','www.audium.org','www.indigorestaurant.com','www.sfdark.com','www.calvarypresbyterian.org','www.brindisicucina.com','www.gourmetwalks.com','www.odcdance.org','www.greenapplebooks.com','www.fior.com','www.fleurdelyssf.com','www.icbbuilding.com','www.rubyliving.com','www.baycitybike.com','www.chsa.org','www.phoenixtheatresf.org','www.sundancecinemas.com','www.streetonpolk.com','www.madpianos.com','www.portolafestival.org','www.chenerypark.com','www.stregis.com','www.venticello.com','www.sfdesigncenter.com','www.michelangelocaffe.com','www.waltdisney.org','www.TheEliteCafe.com','www.rock-it-room.com','www.jones-sf.com','www.counterpulse.org','www.oramv.com','www.broadwaygrill.biz','sf.yoshis.com','www.onelettermandrive.com','www.labelledayspas.com','www.visitfishermanswharf.com','www.B44sf.com','www.hunterspointshipyard.com','www.coirestaurant.com','www.womensbuilding.org','www.sftheaterfestival.org','www.alfredssteakhouse.com','www.williams-sonoma.com','www.iexpresssf.com','www.fogbeltstudio.com','www.cafedunord.com','www.victoriatheatre.org','www.sfopera.com','www.ploufsf.com','sfcentre.nearbynow.com','www.straybarsf.com','www.scomassausalito.com','www.hisfo.com','www.borobudursf.com','www.improv.org','www.jcccnc.org','portal.sre.gob.mx','www.palaceoffinearts.org','www.fillmorestreetsf.com','www.masasrestaurant.com','www.enricossf.com','www.smuinballet.org','www.jccsf.org','www.albonarestaurant.com','www.ybca.org','www.anchorandhopesf.com','www.odctheater.org','www.landmarktheaters.com','www.herchurch.org','www.trattoriapinocchio.com','www.queerculturalcenter.org','www.howweird.org','www.alamosquareseafoodgrill.com','www.cityarts.net','www.sfdph.org','www.momitobys.com','www.sundancesaloon.org','www.wholefoodsmarket.com','www.cellar360.com','www.presidiogolf.com','www.ristorantespecchio.com','www.folsomstreetfair.org','www.sweetwatersaloon.com','love.zinzanni.org','www.ssjeremiahobrien.org','www.terrasf.com','www.marintheatre.org','www.presidentscup.com','www.lolivier-restaurant.com','www.hornblower.com','www.staceys.com','www.longbarsf.com','www.sanmateoexpo.org','www.amber-india.com','www.adornabella.com','www.pastaparadiso.net','www.salsainthesquare.com','www.hiller.org','www.emeraldbowl.org','www.holarestaurant.com','www.bistroluneta.com','www.massake.com','www.barbambino.com','www.sfmarriott.com','www.sterngrove.org','www.sfmcd.org','www.hangarsteaksfo.com','www.garibaldisrestaurant.com','www.michaelmina.net','www.231ellsworth.com','www.beachchalet.com','www.sfjuneteenth.org','www.dailygrill.com','www.collegeofsanmateo.edu','www.barolopacifica.com','www.bouquetstoart.org','www.rnmrestaurant.com','www.sirfrancisdrake.com','www.bayviewoperahouse.org','www.yuzusf.com','www.1550hyde.com','www.uvaenoteca.com','www.folsomstreetfair.com','www.aziza-sf.com','www.lingba.com','www.orsonsf.com','www.thecjm.org','www.gotbubble.com','events.sfgate.com','www.artofthematter.org','www.marinesmemorialtheatre.com','www.poststreettheatre.com','www.zadinsf.com','www.home-sf.com','www.aquariumofthebay.com','www.axis-cafe.com','www.harrisrestaurant.com','www.flourandwater.com','www.cbiworld.org','www.mercedesrestaurant.com','www.ilunabasque.com','www.Bungalow44.com','www.sfelectricworks.com','www.spiedo.com','www.bixrestaurant.com','www.stepsofromecaffe.com','www.sanfranciscohyattregency.com','www.jazzheritagecenter.org','www.ferrybuildingmarketplace.com','www.anticasf.com','www.famsf.org','www.mintplazasf.org','www.pacificcatch.com','www.cioppinosonthewharf.com','www.tiburonchamber.org','www.parksconservancy.org','www.restaurantlulu.com','www.patagonia.com','www.latoscarestaurant.com','www.ruesaintjacques.com','www.cellspace.org','www.sfcolumbusday.org','www.city-sightseeing.us','www.presavi.com','sfyoshis2.inticketing.com','www.lecentralbistro.com','www.nectarwinelounge.com','www.turkeytrailtrot.com','www.bluemermaidsf.com','www.shopthefirm.com','www.abacussf.com','www.josephcozzasalon.com','www.aqua-sf.com','www.victorianalliance.org','www.artisanconfection.com','www.joedimaggiosrestaurant.com','www.therrazzroom.com','www.novabar.com','www.sfworldmusicfestival.org','www.refreshdayspa.com','www.frbsf.org','www.gambardellasrestaurant.com','www.barjohnny.com','www.palominosf.com','www.darkdining.com','www.rickshawstop.com','www.fortmason.org','www.nobhillgrille.com','www.unionsquaresf.net','www.lafolie.com','www.ilfornaio.com','www.fogharborfishhouse.com','www.grandpubahrestaurant.com','www.argonauthotel.com','www.piazzapellegrini.com','www.basilcanteen.com','www.cirquedusoleil.com','www.ristorantebrio.com','events.stanford.edu','www.cafearguellosf.com','disney.go.com','www.cowpalace.com','www.catchsf.com','www.thecanvasgallery.com','www.westbaysf.org','www.haightashburystreetfair.org','www.sfcenter.org','www.treasureislandfestival.com','www.bestofbroadway-sf.com','www.regalitosf.com','www.seejanerun.com','www.sfeagle.com','www.aureasf.com','www.wirtzgallery.com','www.artspan.org','www.freynorris.com','www.triptychsf.com','www.theintersection.org','www.attpark.com','www.brandyhos.com','www.sfmyconos.com','www.sanfranciscohiltonhotel.com','www.zazilrestaurant.com','www.RivaRestaurantLA.com','www.cafekati.com','www.mamacitasf.com','www.artaud.org','www.regencycentersf.com','www.utopiasalonsf.com','www.kinggeorge.com','www.somarts.org','www.pucciniandpinetti.com','www.tommytoys.com','www.ccsf.edu','www.hear-the-world.com','www.andronicos.com','www.thewarfieldtheatre.com','www.nps.gov','www.Eurekarestaurant.com','www.sfpride.org','www.tropisueno.com','www.xyz-sf.com','luisa.ypguides.net','www.fifthfloorrestaurant.com','www.LaTerrassePresidio.com','www.sfjapantown.org','www.zspace.org','www.presidio.gov','www.cathedralhillhotel.com','www.spasole.com','www.hoteltriton.com','www.clubhousecomedy.com','www.sfoarts.org','www.sushi-hunter.com','www.foreigncinema.com','www.winerycollective.com','www.saucesf.com','www.frascatisf.com','www.theindependentsf.com','www.sumisushisf.com','www.RoccosCafe.com','www.sfacgallery.org','www.farallones.org','www.crabhouse39.com','www.big4restaurant.com','www.noontimeconcerts.org','www.piqueos.com','www.sfiaf.org','www.theatrebayarea.org','www.flight001.com','www.DajaniGroup.net','www.maderasandhill.com','www.feminapotens.com','www.nccbf.org','www.truspa.com','www.carecensf.org','www.brickrestaurant.com','www.jdvhotels.com','www.badm.org','www.roysrestaurant.com','www.gostanford.com','www.nbjazzfest.com','www.pacificexpositions.com','www.elbo.com','www.bin38.com','www.stspeterpaul.san-francisco.ca.us','www.celebrationofcraftswomen.org','www.northbeachrestaurant.com','www.theregencyballroom.com','www.cuesa.org','www.stmarycathedralsf.org','www.cafemajesticsf.com','www.capellinis.com','www.cooleatz.com','www.sfsailtours.com','www.nctcsf.org','www.nettiescrabshack.com','www.dacor.com','www.bambinosristorante.com','www.sanfranciscomagicparlor.com','www.orpheum-theater.com','www.balboacafe.com','www.om28.com','www.bonardarestaurant.com','www.heavensdog.com','www.oola-sf.com','www.umamisf.com','www.saporeitaliano.org','www.creolabistro.com','www.aiasf.org','www.voicefactorysf.org','www.billgrahamcivic.com','www.missionculturalcenter.org','www.toronado.com','www.sporksf.com','www.duccasf.com','www.jeantyatjacks.com','www.tipiacera.com','www.lamplighters.org','www.bacarsf.com','www.shipyardartists.com','www.therhino.org','www.gumps.com','www.fleetfeetsanfrancisco.com','www.archipelagobistro.com','www.luellasf.com','www.castagnolas.com','www.kerouacalley.com','www.theatreofyugen.org','www.gaylords.com','www.thecottageeatery.com','www.sprucesf.com','www.nextstagedance.org','www.fringalesf.com','www.commonwealthclub.org','www.moscone.com','www.spn.usace.army.mil','www.kearnystreet.org','www.wonderlandshow.org','www.fareastcafesf.com','www.rainbow.coop','www.citylights.com','www.glbthistory.org','www.alembicbar.com','www.mercurysf.com','www.coolblackball.com','www.farinafoods.com','www.77maidenlane.com','www.cavwinebar.com','www.bebe.com','www.actioncamerasf.com','www.cclarkgallery.com','www.limon-sf.com','www.thechaya.com','www.piscosf.com','www.crystalfair.com','www.nobhillcafe.com','www.mxbuilding.com','www.abcseafoodrestaurant.com','www.koshercomedy.com','www.parks.sfgov.org','www.gitanerestaurant.com','www.meltingpot.com','www.onlyinsanfrancisco.com','www.ybgf.org','www.stanford.edu','www.westfield.com','www.42ndstmoon.org','www.quincerestaurant.com','www.kyo-ya-restaurant.com','www.act-sf.org','www.godemago.com','www.caffemacaroni.com','www.ci.sausalito.ca.us','www.marriott.com','houseofprimerib.ypguides.net','www.clubsix1.com','embassysuites1.hilton.com','www.sfhiphopdancefest.com','www.macys.com','www.aminermiracle.org','www.sfcablecar.com','www.sflyricopera.org','www.colibrimexicanbistro.com','www.traderjoes.com','www.wokwiz.com','www.peopleinplazas.org','www.thedaffodilrestaurant.com','www.slims-sf.com','www.sfindie.com','www.piazzadangelo.com','www.levistrauss.com','www.sanfranciscosoccer.org','www.positively6thstreetfair.org','www.threedegreesrestaurant.com','www.shopyandi.com','www.sfsymphony.org','www.villainssf.com','www.andalusf.com','www.giftcenterpavilion.com','www.jdvhospitality.com','www.chezspencer.net','www.biscuitsandblues.com','www.mythossancarlos.com','www.hotelnikkosf.com','www.hamon-washoku.com','www.greensrestaurant.com','www.grandsanfrancisco.hyatt.com','www.artworksf.com','www.two-sf.com','www.sfcomedyshow.com','www.anamandara.com','www.saintgregorys.com','www.chroniclebooks.com','www.galeriadelaraza.org','www.lastplanettheatre.com','www.dickensfair.com','www.cyc.org','www.foottours.com','sfpl.lib.ca.us','www.sfsu.edu','www.zoommultisports.com','www.stdominics.org','www.sfgirlschorus.org','www.citizencake.com','www.mezessf.com','www.landmarktheatres.com','www.pastapomodoro.com','www.cacciucco.net','www.menlopark.org','www.serpentinesf.com','www.caffesociale.com','www.friendssfpl.org','www.stepsofrometrattoria.com','www.LArdoiseSF.com','www.baykidsmuseum.org','www.111minnagallery.com','www.Porterhousesanmateo.com','www.sfzc.org','www.sfgmc.org','www.marketstreetassociation.org','www.urbantavernsf.com','www.theexit.org','www.2901broadwaystreet.com','www.sfsota.org','www.conservatoryofflowers.org','www.mangarosasf.com','www.opentable.com','www.thespinnaker.com','www.thickdescription.org','www.elpaseorestaurant.com','www.aifisf.com','www.chinatowncommunitydevelopmentcenter.org','www.thecannery.com','www.performances.org','www.barcrudo.com','www.rangesf.com','www.shadowlight.org','www.onemarket.com','www.cafeandree.com','www.parc55hotel.com','www.gatorsneosoul.com','www.markhopkins.net','www.kohsamuiandthemonkey.com','www1.macys.com','www.careme350.com','www.ruthschris.com','www.Sodinisbertoluccis.com','www.ymcasf.org','www.sfgov.org','www.tokyogogo.com','www.ramadaplazasf.com','www.supperclub.com','www.pescesf.com','www.sfmt.org','www.redandwhite.com','www.yoshis.com','www.boulevardrestaurant.com','www.copenhagenbakery.com','www.chinagrillmanagement.com','www.ziryabgrill.com','www.californiahistoricalsociety.org','www.ScheinAndSchein.com','ccva.stanford.edu','www.mh-a.com','www.lunaparksf.com','www.presidiosocialclub.com','www.livenation.com','www.internationalorange.com','www.WagyuA5.com','www.zincdetails.com','www.mariamariarestaurants.com','www.magictheatre.org','www.betelnutrestaurant.com','www.firstcrush.com','www.precitaeyes.org','www.jonsimsctr.org','www.harding-park.com','www.pier23cafe.com','www.modernmexican.com','www.1300fillmore.com','www.poggiotrattoria.com','www.istanbulsancarlos.com','www.himerestaurant.com','www.fishandfarmsf.com','www.sheltontheater.com','www.poesiasf.com','www.49ers.com','www.unionstreetpapery.com','www.pressclubsf.com','www.ristorante-portofino.com','www.anandafuara.com','www.gingkofurniture.com','www.maxfields-restaurant.com','www.azierestaurant.com','www.lacocinasf.org','www.bistrovidamp.com','www.fourseasr.com','www.sfmission.com','www.surlatable.com','www.bubblelounge.com','www.horatius.com','www.c-c-c.org','www.salthousesf.com','www.magnetsf.org','www.sfyc.org','www.sfpalace.com','www.stacksrestaurant.com','www.usfca.edu','www.dancemission.com','www.missionbeachcafesf.com','www.boudinbakery.com','www.centralparkbistro.com','www.marineclub.com','www.gordonbiersch.com','www.aquariusrecords.org','www.streetlightrecords.com','www.perryssf.com','sanfranciscoairport.hyatt.com','www.kabukisprings.com','www.lucewinerestaurant.com','www.qrestaurant.com','www.izzyssteaksandchops.com','www.thestinkingrose.com','www.lurerestaurant.com','www.caffebellavenezia.com','www.unionstreetsf.com','www.pier39.com','www.themossroom.com','www.raykophoto.com','www.decoratorshowcase.org','www.leftbank.com','www.southparkcafesf.com','www.zuppa-sf.com','www.zunicafe.com','www.jackfalstaff.com','www.kingfish.net','www.zareflytrap.com','www.blackangus.com','www.sozaisf.com','www.thelab.org','www.shoebizsf.com','www.ypt.org','www.solunasf.com','www.sfcvb.org','www.letseat.at','www.shnsf.com','www.elriosf.com','www.bdom.com','www.roccapulco.com','www.aaacc.org','www.bucadibeppo.com','www.piperade.com','www.bjesf.org','www.boboquivaris.com','cob.sfsu.edu','www.Troyasf.com','www.castafiorerestaurant.com','www.greenfestivals.org','www.gardencourt-restaurant.com','www.espetus.com','www.southfwb.com','www.goethe.de','www.staroftheseasf.com','www.soex.org','www.plumpjackcafe.com','www.labriciola-sf.com','www.farallonrestaurant.com','www.sfbaywhalewatching.com','www.indiaclayoven.com','www.act-sfbay.org','www.paulkrestaurant.com','www.farmerbrownsf.com','www.scalasbistro.com','www.sfcamerawork.org','www.rumisancarlos.com','www.chiaroscurosf.com','www.lecolonialsf.com','www.crushpadwine.com','www.bimbos365club.com','www.isarestaurant.com','www.ponzurestaurant.com','www.aquariumofthebay.org','www.millenniumrestaurant.com','www.sfmaverick.com','www.pescheria-sf.com','www.modernisminc.com','www.chakrasalonspa.com','www.embarcaderocenter.com','www.chanticleer.org','sanfrancisco.panpacific.com','www.tonyandtinasanfrancisco.com','www.mortons.com','www.castrotheatre.com','www.lascenecafesf.com','www.vietccsf.org','www.absinthe.com','www.rulli.com','www.chancellorhotel.com','www.infusionlounge.com','www.hayesvalleyshop.com','www.rosepistola.com','www.lemongrasssf.com','www.thebluemacawsf.com','www.magicfluteristorante.com','www.levendesf.com','www.newdelhirestaurant.com','www.cafemozartsf.com','www.johnsgrill.com','www.franciscancrabrestaurant.com','www.bayareacabaret.org','www.gracecathedral.org','www.destinosf.com','www.victorianwalk.com','www.nlfchildcare.org','www.acquerello.com','www.aliotos.com','www.projectsport.com','www.marketstreetgrillsf.com','www.thecastrotheatre.com','www.horizonsf.com','www.marqsinmenlo.com','www.cosmopolitansf.com','www.cafepescatore.com','www.pge.com','www.mindspring.com','www.garconsf.com','www.asiasf.com','www.qoolsf.com','www.linesballet.org','www.janetpomeroy.org','www.capanninasf.com','www.midisanfrancisco.com','www.theshermanrestaurant.com','www.oakcitybarandgrill.com','www.exploratorium.edu','www.westinstfrancis.com','www.142ThrockmortonTheatre.com','www.yorkhotel.com','www.zinniasf.com','www.imperialpalacesf.com','www.breezysf.com','www.zeum.org','www.zingari.com','www.pranasf.com','www.joeyandeddies.com','www.oldsaintmarys.org','www.stpatricksf.org','www.santorinisf.com','www.starwoodhotels.com','www.sanfranciscochinatown.com','www.kokkari.com','www.noodletheory.com','www.hornblowerholidays.com','www.thewarfieldtheatre.com','www.showboxonline.com','www.treasureislandfestival.com']
  391.